package org.raymond.iworks.study.netty.official.fundamental.time2;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise;
import lombok.extern.slf4j.Slf4j;

/**
 * @author raymond
 * @version V1.0
 * @Description: 实现一个ChannelOutboundHandler 的encoder将UnixTime放入ByteBuf中.
 * 这比实现一个decoder要简单很多,因为你不需要考虑数据包的分片问题
 * 要点一.首先,我们传递了一个ChannelPromise,当数据发送成功或失败Netty会用ChannelPromise进行标记.
 * 要点二,我们没有调用flush()操作.handler有一个特殊的方法void flush(ChannelHandlerContext ctx)是flush()的操作的重写.
 */
@Slf4j
public class TimeEncoder extends ChannelOutboundHandlerAdapter {
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
        UnixTime m = (UnixTime) msg;
        ByteBuf encoded = ctx.alloc().buffer(4);
        encoded.writeInt((int)m.value());
        ctx.write(encoded, promise); // (1)

        log.info("server encode: {}",msg);
    }

    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("encoder exceptionCaught...", cause);
        ctx.close();
    }
}
